page.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. 'use client';
  2. import { use } from 'react';
  3. import { useDonationHub } from '@/hooks/useDonationHub';
  4. import './style.scss';
  5. type Props = {
  6. params: Promise<{ widgetToken: string }>;
  7. };
  8. const DEFAULT_ICON = '/images/default-avatar.png';
  9. export default function CrewLeaderboardPage({ params }: Props) {
  10. const { widgetToken } = use(params);
  11. const hubUrl = process.env.NEXT_PUBLIC_API_URL + '/hubs/donation';
  12. const { crewRanking } = useDonationHub(widgetToken, hubUrl);
  13. return (
  14. <div className="crew-widget">
  15. <div className="crew-title">크루 리더보드</div>
  16. <div className="crew-list">
  17. {crewRanking.length === 0 && (
  18. <div className="crew-empty">크루 데이터 대기 중...</div>
  19. )}
  20. {crewRanking.map(item => {
  21. const rankClass = item.rank <= 3 ? `crew-rank-${item.rank}` : '';
  22. const topClass = item.rank <= 3 ? `top-${item.rank}` : 'top-default';
  23. return (
  24. <div key={item.crewMemberID} className={`crew-item ${rankClass}`}>
  25. <div className={`crew-rank-num ${topClass}`}>{item.rank}</div>
  26. <img className="crew-icon" src={item.icon || DEFAULT_ICON} alt={item.nickname} />
  27. <div className="crew-info">
  28. <div className="crew-nickname">{item.nickname}</div>
  29. {item.channelName && <div className="crew-channel">{item.channelName}</div>}
  30. </div>
  31. <div className="crew-stats">
  32. <div className="crew-amount">{item.totalAmount.toLocaleString()}원</div>
  33. <div className="crew-contribution">{item.contributionRate.toFixed(1)}%</div>
  34. </div>
  35. </div>
  36. );
  37. })}
  38. </div>
  39. </div>
  40. );
  41. }